home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / os30 / gfx / animdemo.lha / ilbm.asm < prev    next >
Assembly Source File  |  1993-01-22  |  5KB  |  226 lines

  1. *******************************************************************************
  2. *
  3. * (c) Copyright 1993 Commodore-Amiga, Inc.  All rights reserved.
  4. *
  5. * This software is provided as-is and is subject to change; no warranties
  6. * are made.  All use is at your own risk.  No liability or responsibility
  7. * is assumed.
  8. *
  9. * ilbm.asm - code to decode ILBMs and LONG DLTAs.
  10. * This code has some 68020 optimisations, and the DLTA code has some
  11. * optimisations best suited for my animation (namely, changing the order in
  12. * which the DLTA opcodes are checked).
  13. *
  14. *******************************************************************************
  15.  
  16.     incdir    'include:'
  17.     include    'intuition/screens.i'
  18.     include 'graphics/rastport.i'
  19.     include    'graphics/gfx.i'
  20.     include    "playanim.i"
  21.  
  22.     opt p=68020
  23.  
  24. * void __asm ShowILBM(register __a0 struct BitMapHeader *bmhd, register __a1 struct BitMap *bm, register __a2 UBYTE *buff);
  25.  
  26.     xdef    _ShowILBM
  27. _ShowILBM:
  28.     movem.l    a2-a6/d2-d7,-(sp)
  29.  
  30.     lea    bm_Planes(a1),a3
  31.     moveq    #0,d2
  32.     move.l    d2,d7
  33.     move.l    d2,d3
  34.     move.w    bm_BytesPerRow(a1),d2
  35.  
  36.     move.b    bmhd_nplanes(a0),d7
  37.     subq.b    #1,d7
  38.     move.w    bmhd_h(a0),d6
  39.     move.w    bmhd_w(a0),d5
  40.     add.w    #15,d5
  41.     asr.w    #4,d5
  42.     add.w    d5,d5            ; bytes per row in the image
  43.  
  44.     move.w    d7,d4
  45.     bra.s    do_rows.
  46.  
  47. do_rows:
  48.     move.l    a3,a4            ; restore plane pointers
  49. next_plane:
  50.     sub.l    a5,a5
  51.     move.l    (a4)+,a0        ; plane pointer
  52.     adda.l    d3,a0            ; to next row
  53.  
  54. next_col:
  55.     move.b    (a2)+,d0        ; next byte in the buffer    
  56.     bpl.s    do_copy
  57.  
  58.     neg.b    d0            ; repeat the next byte d0 times
  59.     ext.w    d0
  60.     bmi.s    next_col        ; was 128 == NOP
  61.     add.w    d0,a5
  62.     addq.w    #1,a5
  63.     move.b    (a2)+,d1
  64. 1$:
  65.     move.b    d1,(a0)+
  66.     dbra.s    d0,1$
  67. check_col:
  68.     cmp.w    a5,d5
  69.     bne.s    next_col
  70.  
  71.     dbra.s    d4,next_plane
  72.  
  73.     move.w    d7,d4            ; restore plane counter
  74.     add.l    d2,d3            ; next row in the bitmap
  75. do_rows.:
  76.     dbra.s    d6,do_rows
  77.  
  78. ShowILBM.:
  79.     movem.l    (sp)+,d2-d7/a2-a6
  80.     rts
  81.  
  82. do_copy:
  83.     ext.w    d0
  84.     addq.b    #1,d0
  85.     add.w    d0,a5
  86.  
  87.     move.w    d0,a6
  88.     asr.w    #2,d0            ; how many longwords?
  89.     bra.s    copy_l.
  90. copy_l:
  91.     move.l    (a2)+,(a0)+    
  92. copy_l.:
  93.     dbra.s    d0,copy_l
  94.  
  95.     move.w    a6,d0
  96.     and.w    #$3,d0            ; this many bytes left over
  97.     bra.s    copy_b.
  98. copy_b:
  99.     move.b    (a2)+,(a0)+
  100. copy_b.:
  101.     dbra.s    d0,copy_b
  102.     bra.s    check_col
  103.  
  104.  
  105. * void __asm PlayDLTA(register __a2 struct BitMap *bm, register __a1 UBYTE *buff, register __a3 WORD *table, register __d4 UWORD ImageWidth, register __d5 UWORD ImageDepth);
  106.     xdef _PlayDLTA
  107. _PlayDLTA:
  108.     movem.l    a2/a5-a6/d2-d7,-(sp)
  109.  
  110.     move.l    a1,a5
  111.  
  112.     asr.w    #2,d4            ; /4 for the LONG compression
  113.     moveq    #0,d3
  114.     move.w    bm_BytesPerRow(a2),d2
  115.     lea    bm_Planes(a2),a6
  116.     bra.s    loop.
  117. loop:
  118.     move.l    (a6)+,a2        ; next bitplane OUT
  119.     move.l    a5,a0
  120.     add.l    0(a5,d3),a0        ; next plane IN
  121.     addq.w    #4,d3
  122.     bsr.s    _DecodeVKPlane
  123. loop.:    
  124.     dbra.s    d5,loop
  125.  
  126.     movem.l    (sp)+,a2/a5-a6/d2-d7
  127.     rts
  128.  
  129. ; LONG ASM DecodeVKPlane (REG (a0) char *in, REG(a2) char *out, REG (d2) LONG BytesPerRow, REG (a3) WORD *ytable, REG (d4) xcount);
  130.  
  131. _DecodeVKPlane:
  132.     movem.l    a2/a3/d2-d5,-(sp)    ; save registers
  133.     moveq    #7,d6
  134.     move.l    #$7fffffff,d7
  135.     bra    zdcp            ; And go to the "columns" loop
  136.  
  137. dcp
  138.     move.l    a2,a1            ; get copy of dest pointer
  139.     move.l    (a0)+,d0        ; fetch number of ops in this column
  140.     bra    zdcvclp            ; and branch to the "op" loop.
  141.  
  142. dcvclp:
  143.     move.l    (a0)+,d1        ; fetch next op
  144.     bmi    dcvskuniq        ; if hi-bit set branch to "uniq" decoder
  145.     bne    skip            ; if op is >0, then it's a "skip"
  146.  
  147. dcvsame                    ; here we decode a "vertical same run"
  148.     move.l    (a0)+,d1        ; fetch the count
  149.     move.l    (a0)+,d3        ; fetch the value to repeat
  150.     move.w    d1,d5            ; and do what it takes to fall into a "tower"
  151.     lsr.w    #3,d5            ; d5 holds # of times to loop through tower
  152.     and.w    d6,d1            ; d1 is the remainder
  153.     add.w    d1,d1
  154.     add.w    d1,d1
  155.     neg.w    d1
  156.     jmp    32+same_tower(pc,d1.w)
  157.  
  158. same_tower
  159.     move.l    d3,(a1)
  160.     adda.w    d2,a1
  161.     move.l    d3,(a1)
  162.     adda.w    d2,a1
  163.     move.l    d3,(a1)
  164.     adda.w    d2,a1
  165.     move.l    d3,(a1)
  166.     adda.w    d2,a1
  167.     move.l    d3,(a1)
  168.     adda.w    d2,a1
  169.     move.l    d3,(a1)
  170.     adda.w    d2,a1
  171.     move.l    d3,(a1)
  172.     adda.w    d2,a1
  173.     move.l    d3,(a1)
  174.     adda.w    d2,a1
  175.     dbra    d5,same_tower
  176.     dbra    d0,dcvclp
  177.     addq.l    #4,a2
  178.     dbra    d4,dcp
  179.     movem.l    (sp)+,a2/a3/d2-d5
  180.     rts
  181.  
  182. skip                    ; otherwise it's just a skip
  183. *                    ; use amount to skip as index into word-table
  184.     adda.w    (0,a3,d1.w*2),a1
  185.     dbra    d0,dcvclp        ; go back to top of op loop
  186.     addq.l    #4,a2
  187.     dbra    d4,dcp
  188.     movem.l    (sp)+,a2/a3/d2-d5
  189.     rts
  190.  
  191.  
  192. dcvskuniq                ; here we decode a "unique" run
  193.     and.l    d7,d1            ; setting up a tower as above....
  194.     move.w    d1,d5
  195.     lsr.w    #3,d5
  196.     and.w    d6,d1
  197.     add.w    d1,d1
  198.     add.w    d1,d1
  199.     neg.w    d1
  200.     jmp    32+uniq_tower(pc,d1.w)
  201. uniq_tower
  202.     move.l    (a0)+,(a1)
  203.     adda.w    d2,a1
  204.     move.l    (a0)+,(a1)
  205.     adda.w    d2,a1
  206.     move.l    (a0)+,(a1)
  207.     adda.w    d2,a1
  208.     move.l    (a0)+,(a1)
  209.     adda.w    d2,a1
  210.     move.l    (a0)+,(a1)
  211.     adda.w    d2,a1
  212.     move.l    (a0)+,(a1)
  213.     adda.w    d2,a1
  214.     move.l    (a0)+,(a1)
  215.     adda.w    d2,a1
  216.     move.l    (a0)+,(a1)
  217.     adda.w    d2,a1
  218.     dbra    d5,uniq_tower        ; branch back up to "op" loop
  219. zdcvclp dbra    d0,dcvclp        ; branch back up to "column loop"
  220.  
  221.                     ; now we've finished decoding a single column
  222. z1dcp    addq.l    #4,a2            ; so move the dest pointer to next column
  223. zdcp    dbra    d4,dcp            ; and go do it again what say?
  224.     movem.l    (sp)+,a2/a3/d2-d5    ; restore registers
  225.     rts
  226.